package Problem.project;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*
     第三种解决线程安全的方法：lock锁

     lock锁：1.是一个接口
             2.lock锁提供了比使用synchronize方法更广泛的锁操作
             3.lock接口中的方法：void lock（）：获取锁
                               void unlock（）：释放锁
             4.ReentrantLock：lock接口的实现类

      使用步骤：1.在定义成员变量的位置使用多态创建一个ReentrantLock对象 （父类是lock接口）
               2.在可能出现安全问题的代码调用之前使用lock接口中的lock（）方法获取锁（获取锁）
               3.在可能出现安全问题的代码调用之后使用lock接口中的unlock（）方法释放锁(放到finally中，可以在任何情况下都释放锁)
 */
public class MyProblem3 implements Runnable {
    private int ticket = 100;
    //1.在定义成员变量的位置使用多态创建一个ReentrantLock对象 （父类是lock接口）
    Lock l = new ReentrantLock();//创建锁对象

    @Override
    public void run() {
        while (ticket > 0) {
            //2.在可能出现安全问题的代码调用之前使用lock接口中的lock（）方法获取锁（获取锁）
            l.lock();
            if (ticket > 0) {
                try {  //将线程任务放到try中
                    Thread.sleep(100); //睡眠100毫秒在启用线程
                    System.out.println("lock锁" + ticket + "张票");
                    ticket--;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    l.unlock();//无论程序是否出现异常，锁对象都能释放掉，提高程序的系效率
                }
            }
            else {
                break;
            }

        }
    }
}